Find
the last digit of the k-th
Fibonacci number.
Fibonacci
numbers are defined by the following recurrence relations:
Input. Each
line contains a single number k (0 ≤ k ≤ 9223372036854775807).
Output. For
each test case print in a separate line the last digit of the k-th Fibonacci number.
Sample input |
Sample output |
0 1 2 37 135 23 |
1 1 2 9 7 8 |
Fibonacci numbers
Consider the next problem. In how many ways is it possible to
cover the strip 1 × n with domino of size 1
× 2 and squares of
size 1 × 1? Let this number of ways be f(n). Obviously
that f(1) = 1, f(2) = 2.
If we cover the first cell of the
table with a square, then
we need to cover the strip 1 × (n – 1), it can be done in f(n – 1) ways. If
we cover the first and the second cell of the table with a domino, then we need to cover the strip 1 × (n – 2), it can be done in f(n – 2) ways.
Thus f(n) = f(n – 1) + f(n – 2), so f(n) are Fibonacci numbers.
Let we have a table 1 × (n + m). It can be covered in f(n + m) ways. First we consider the coverings without
domino that covers the cells n and n + 1.
Then the first n cells can be
covered with squares and dominos in f(n) ways, and the last m cells
can be covered with f(m) ways. That is, the
entire table can be covered in f(n) * f(m) ways.
Now consider the coverings where one
domino covers the cells n and n + 1. We have f(n –
1) * f(m –
1) such coverings.
Summarizing, we
get that
f(n + m) = f(n) * f(m) + f(n –
1) * f(m –
1),
f(1) = 1, f(2) = 2.
Let's obtain some identities
from the indicated recurrence:
·
if
m = n, then f(2n) = f(n) * f(n) + f(n –
1) * f(n –
1),
·
if m = n + 1, then f(2n + 1) = f(n) * f(n
+ 1) + f(n – 1) * f(n)
Since the
indices of the calculated Fibonacci numbers have the order of 1018, it is impossible to use a
linear array of this size for memorization. To memorize the results we’ll
use the map data structure.
map<long long, long long> fib;
The calculation of the n-th
Fibonacci number.
long long f(long long n)
{
if (n <= 1) return 1;
if (n == 2) return 2;
if (fib[n] != 0) return fib[n];
long long k = n / 2;
if (n % 2 == 0)
return fib[n] = (f(k - 1) *
f(k - 1) + f(k) * f(k)) % 10;
return fib[n] = (f(k) * (f(k
- 1) + f(k + 1))) % 10;
}
The main part of the program. Read the input value n and print the n-th
Fibonacci number f(n).
while (scanf("%lld", &n) == 1)
printf("%lld\n", f(n));